package me.sunpeng.Wildcard.demo3;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @author sp
 */
public class TypeParameterTest {

    //第一种声明：简单，灵活性低
    public static <T extends Comparable<T>> void mySort1(List<T> list) {

        Collections.sort(list);
    }


    //第二种声明：复杂，灵活性高
    public static <T extends Comparable<? super T>> void mySort2(List<T> list) {
        Collections.sort(list);
    }

    public static <T extends Animal> void mySort3(List<T> list)
    {
        Collections.sort(list);
    }


    public static void mySort4(List<? extends Animal> list)
    {
        Collections.sort(list);
    }

    public static void main(String[] args) {


        //创建一个Aniaml List
        List<Animal> animals = new ArrayList<>();

        animals.add(new Animal(25));
        animals.add(new Dog(35));

        //创建一个Dog List
        List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog(5));
        dogs.add(new Dog(18));

        //测试mySort1 方法
        //Animal 实现了Comparable 接口
//        mySort1(animals);
        //Dog 没有实现Comparable接口，编译报错，animals list 中实际上是包含一个 Dog 实例的。
        // 如果你碰上类似的情况（子类 list 不能传入到一个方法中），可以考虑把子类实例放到一个父类 List 中，
        // 避免编译错误
//        mySort1(dogs);

        //测试mySort2方法
        mySort2(animals);
        mySort2(dogs);


        mySort3(animals);
        mySort3(dogs);


        mySort4(animals);
        mySort4(dogs);




    }

}
